﻿#pragma once
#include "desCommonType.hpp"

namespace des {



// 用于分别操作一个64bit块的左32bit和右32bit
union __PlaintextBlock {
	struct {
		int32 right;
		int32 left;
	};
	int64 block;
};



// 按table表对src block进行位置换操作，生成新的block
template <typename _TableType>
requires requires {
	requires _TableType().size() <= 64;
}
inline constexpr
int64 __bitPermutation(int64 const src, _TableType const& table) {

	int64 res = 0;
	for (int8 i = 0; i != table.size(); ++i) {
		res <<= 1;		// 往左移动一位留出空位
		res |= ((src & (0x8000000000000000 >> (table[i] - 1))) != 0);	// 将位与出并放入空位
	}
	res <<= (64 - table.size());	// 不足64位末尾padding

	return res;
}



}
